﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using condortravel.operaciones.business.operaciones;
using condortravel.operaciones.persistence.operacionesImpl;
using condortravel.operaciones.core.DataModel;
using condortravel.operaciones.common;
using condortravel.operaciones.entities.Entities;
using LinqKit;
namespace condortravel.operaciones.business.operacionesImpl
{
    public class OperacionesServicesImpl : OperacionesServices
    {

        #region Businness Objects

        private EventoExtraordinarioDAOImpl eventoExtraordinarioDAOImpl;

        public EventoExtraordinarioDAOImpl EventoExtraordinarioDAO
        {
            get { return eventoExtraordinarioDAOImpl; }
            set { eventoExtraordinarioDAOImpl = value; }
        }
        private ItinerarioDAOImpl itinerarioDAO;

        public ItinerarioDAOImpl ItinerarioDAO
        {
            set { itinerarioDAO = value; }
        }
      
        private EventoDAOImpl eventoDAOImpl;

        public EventoDAOImpl EventoDAO
        {
            set { eventoDAOImpl = value; }
        }
       
        private ProgramacionDAOImpl programacionDAOImpl;

        public ProgramacionDAOImpl ProgramacionDAO
        {

            set { programacionDAOImpl = value; }
        }

        private ReportDAOImpl reportDAOImpl;

        public ReportDAOImpl ReportDAO
        {
            get { return reportDAOImpl; }
            set { reportDAOImpl = value; }
        }

        private TourOperacionesDAOImpl tourOperacionesDAOImpl;

        public TourOperacionesDAOImpl TourOperacionesDAO
        {
            
            set { tourOperacionesDAOImpl = value; }
        }

        private DetalleTourDAOImpl detalleTourDAOImpl;

        public DetalleTourDAOImpl DetalleTourDAO
        {
            
            set { detalleTourDAOImpl = value; }
        }

        private RecursosSolicitadosDAOImpl recursosSolicitadosDAOimp;

        public RecursosSolicitadosDAOImpl RecursosSolicitadosDAO
        {
            get { return recursosSolicitadosDAOimp; }
            set { recursosSolicitadosDAOimp = value; }
        }

        private PaqueteProgramadoDAOImpl paqueteProgramadoDAOImpl;

        public PaqueteProgramadoDAOImpl PaqueteProgramadoDAO
        {

            set { paqueteProgramadoDAOImpl = value; }
        }

        private DetalleProgramadoDAOImpl detalleProgramadoDAOImpl;

        public DetalleProgramadoDAOImpl DetalleProgramadoDAO
        {            
            set { detalleProgramadoDAOImpl = value; }
        }
        #endregion
        

        #region OperacionesServices - Seguimiento

        public List<Tb_ItinerarioViajero> getListItinerarioByCliente(int cliente)
        {
            return itinerarioDAO.getListItinerarioByCliente(cliente);
        }


        public List<condortravel.operaciones.core.DataModel.Tb_ItinerarioViajero> getListItinerarioByCriteria(FilterItinerarioCriteria criteria)
        {
            return itinerarioDAO.getListItinerarioByCriteria(criteria);
        }
        public List<condortravel.operaciones.core.DataModel.Tb_ItinerarioViajero> getListItinerarioByAgente(FilterItinerarioCriteria criteria)
        {
            return itinerarioDAO.getListItinerarioByAgent(criteria);
        }
       

        public condortravel.operaciones.core.DataModel.Tb_ItinerarioViajero getItinerarioByCodigo(int codigoItinerario)
        {
            return itinerarioDAO.getByID(codigoItinerario);
        }

        public void updateItinerario(condortravel.operaciones.core.DataModel.Tb_ItinerarioViajero itinerario)
        {
            itinerarioDAO.update(itinerario);
        }

        public condortravel.operaciones.core.DataModel.Tb_ServiciosProgramados getProgramacionByCodigo(long codigoProgramacion)
        {
            return programacionDAOImpl.getByID(codigoProgramacion);
        }

        public List<condortravel.operaciones.core.DataModel.Tb_ServiciosProgramados> getListProgramaciones(long codigoItinerario)
        {
            return programacionDAOImpl.getListProgramaciones(codigoItinerario);
        }

        public void updateProgramacion(condortravel.operaciones.core.DataModel.Tb_ServiciosProgramados programacion)
        {
            //Se actualiza la programacion
            condortravel.operaciones.core.DataModel.Tb_ServiciosProgramados prog = programacionDAOImpl.getByID(programacion.programacion_ID);
            if (prog != null)
            {
                if (prog.Tb_ItinerarioViajero.estadoItinerario_ID == AppStatic.VAR_OPE_EStADO_ITINERARIO_FINALIZADO)
                    throw new condortravel.operaciones.error.Operaciones.OperacionesException.NoCrearActualizarProgEstadoFinalizadoOPException();

                programacionDAOImpl.update(programacion);
                //Se verifica si todos las programaciones asociadas al itinerario estan "Finalizadas"            
                List<Tb_ServiciosProgramados> programaciones =
                                    programacionDAOImpl.getListProgramaciones(prog.itinerarioViajero_ID);
                int contadorFinalizado = 0;
                int contadorEjecucion = 0;
                foreach (Tb_ServiciosProgramados programactualizar in programaciones)
                {
                    if (programactualizar.estadoProgramacion_ID == AppStatic.VAR_OPE_ESTADO_PROGRAMACION_FINALIZADO)
                        contadorFinalizado++;
                    if (programactualizar.estadoProgramacion_ID == AppStatic.VAR_OPE_ESTADO_PROGRAMACION_EJECUCIONFA ||
                        programactualizar.estadoProgramacion_ID == AppStatic.VAR_OPE_ESTADO_PROGRAMACION_EJECUCIONOK
                        )
                        contadorEjecucion++;
                }
                Tb_ItinerarioViajero itinerario = new Tb_ItinerarioViajero();
                itinerario.itinerarioViajero_ID = prog.itinerarioViajero_ID;

                if (contadorEjecucion > 0)
                {
                    //Actualizar el estado de itinerario a en ejecución VAR_OPE_EStADO_ITINERARIO_ENEJECUCION
                    itinerario.estadoItinerario_ID = AppStatic.VAR_OPE_EStADO_ITINERARIO_ENEJECUCION;
                    itinerarioDAO.updateEstadoItinerario(itinerario);

                }
                if (contadorFinalizado == programaciones.Count)
                {
                    //Actualiza el itinerario a finalizado                   
                    itinerario.estadoItinerario_ID = AppStatic.VAR_OPE_EStADO_ITINERARIO_FINALIZADO;
                    itinerarioDAO.updateEstadoItinerario(itinerario);
                }


            }
        }

        public List<condortravel.operaciones.core.DataModel.Tb_Evento> getListEventoByProgramacion(long codigoProgramacion)
        {

            return eventoDAOImpl.getListEventos(codigoProgramacion);
        }

        public void updateEvento(condortravel.operaciones.core.DataModel.Tb_Evento evento)
        {
            Tb_ServiciosProgramados servicio = programacionDAOImpl.getByID(evento.programacion_ID);
            if (servicio != null)
            {
                if (servicio.estadoProgramacion_ID == AppStatic.VAR_OPE_ESTADO_PROGRAMACION_FINALIZADO)
                    throw new condortravel.operaciones.error.Operaciones.OperacionesException.NoCrearEventoEstadoFinalizadoOPException();
                if (evento.evento_ID == 0)
                    eventoDAOImpl.add(evento);
                else
                    eventoDAOImpl.update(evento);
            }
            else
                throw new Exception("Error en el sistema");
        }

        public condortravel.operaciones.core.DataModel.Tb_Evento getEventoByCodigo(long evento)
        {
            return eventoDAOImpl.getByID(evento);
        }

        public void eliminarEvento(long codigo)
        {
            eventoDAOImpl.delete(codigo);
        }

       

       

        #endregion
        

        #region Reportes
        public List<Tb_Evento> getReporteOperaciones(entities.Entities.FilterItinerarioCriteria filtro)
        {
            return reportDAOImpl.getReporteEvento(filtro);
        }

        public List<Tb_Incidencia> getReporteIncidencia(FilterIncidentesCriteria filtro)
        {
            return reportDAOImpl.getReporteIncidencia(filtro);
        }
        #endregion

        #region Eventos extraordinarios
        /// <summary>
        /// Obtener la lista de los eventos extraordinarios segun criterios de busqueda
        /// </summary>
        /// <param name="criterios"></param>
        /// <returns></returns>
        public List<Tb_EventoExtraordinario> getListEventosExtByCriteria(FilterEventoExtCriteria criterios)
        {
            return eventoExtraordinarioDAOImpl.getListEventosExtByCriteria(criterios);
        }
        /// <summary>
        /// GUardar un evento extraordinario
        /// </summary>
        /// <param name="eventoExtra"></param>
        /// <returns></returns>
        public Tb_EventoExtraordinario guardarEventoExtra(Tb_EventoExtraordinario eventoExtra)
        {
            if (eventoExtra.eventoExt_ID == 0)
                return eventoExtraordinarioDAOImpl.add(eventoExtra);
            else
                return eventoExtraordinarioDAOImpl.update(eventoExtra);
        }

        public Tb_EventoExtraordinario getEventoExtraordinarioByID(int codigo)
        {
            return eventoExtraordinarioDAOImpl.getByID(codigo);
        }

        public void eliminarEventoExtraordinario(int codigo)
        {
            eventoExtraordinarioDAOImpl.delete(codigo);
        }
        #endregion

        #region Informacion Tour

        public Tb_Tour addTour(Tb_Tour tour)
        {            
            return tourOperacionesDAOImpl.add(tour);
        }

        public void addDetalleTour(Tb_Tour tour, IList<Tb_Detalle_PaqueteProgramado> listaDetPaqProgramado)
        {
            foreach(Tb_Detalle_PaqueteProgramado detalle in listaDetPaqProgramado)
            {
                Tb_Detalle_Tour detalleTour=new Tb_Detalle_Tour();
                detalleTour.detallePaqueteProgramado_ID=detalle.detallePaqueteProgramado_ID;
                detalleTour.detalleTour_ID=tour.tour_ID;
                detalleTourDAOImpl.add(detalleTour);
            }
            
        }

        public void addRecursoSolicitado(Tb_RecursosSolicitados recursoSolicitado)
        {
            recursosSolicitadosDAOimp.add(recursoSolicitado);
        }

        public IList<Tb_PaqueteProgramado> getListPaqueteProgramadoPendientes()
        {
            return paqueteProgramadoDAOImpl.getListPaqueteProgramadoPendientes();
            
        }

        public IList<Tb_Detalle_PaqueteProgramado> getListDetallePaqueteProgramado(int paquete)
        {
            var likeExpression=PredicateBuilder.True<Tb_Detalle_PaqueteProgramado>();
            likeExpression=likeExpression.Or(p=>p.paqueteTurProg_ID==paquete);
            return detalleProgramadoDAOImpl.getList(likeExpression);
            
        }
        public Tb_PaqueteProgramado getPaqueteProgramado(int codigoPaquete)
        {
            return paqueteProgramadoDAOImpl.getByID(codigoPaquete);
        }

        public IList<Tb_Detalle_Tour> addTourDetalle(Tb_Tour tour, int paqueteProgramado)
        {
            if (tour.tour_ID == 0)
            {
                Tb_Tour nuevoTour = this.addTour(tour);
                IList<Tb_Detalle_PaqueteProgramado> lista = getListDetallePaqueteProgramado(paqueteProgramado);
                foreach (Tb_Detalle_PaqueteProgramado detalle in lista)
                {
                    Tb_Detalle_Tour detalleTour = new Tb_Detalle_Tour();
                    detalleTour.tour_ID = nuevoTour.tour_ID;
                    detalleTour.detallePaqueteProgramado_ID = detalle.detallePaqueteProgramado_ID;
                    this.addDetalleTour(detalleTour);
                }
                return getListDetalleTour(nuevoTour.tour_ID);

            }
            else return null;
        }
        
        public IList<Tb_Detalle_Tour> getListDetalleTour(int tour)
        {
            return detalleTourDAOImpl.getListDetalleTour(tour);
        }

        public void addDetalleTour(Tb_Detalle_Tour detalle)
        {
            detalleTourDAOImpl.add(detalle);
        }
        public IList<Tb_RecursosSolicitados> getListRecursosSolicitados(int detalleTour)
        {
            return recursosSolicitadosDAOimp.getListRecursosSolicitados(detalleTour);
        }

		public IList<Tb_RecursosSolicitados> getListRecursosSolicitados(int detalleTour,int tipoRecurso)
        {
            return recursosSolicitadosDAOimp.getListRecursosSolicitados(detalleTour, tipoRecurso);
        }

        public void updatePaqueteProgramado(int paqueteProgramado)
        {
            Tb_PaqueteProgramado paquetep= paqueteProgramadoDAOImpl.getByID(paqueteProgramado);
            paquetep.estadoPaquete_ID = "104";//Asignado
            paqueteProgramadoDAOImpl.update(paquetep);

        }

		public void eliminarRecursoSolicitado(int codigo)
        {
            recursosSolicitadosDAOimp.delete(codigo);
        }
        #endregion




























    }
}
